package ArrayQueue;

public class ArrayQueue {
    //队头指针，指向的是下一个出队的数据的前一个位置
    private int front = -1;
    //队尾指针，指向的是下一个入队的数据的前一个位置
    private int rear = -1;

    //队列存储数据的最大值，因为是通过数组模拟队列，所以需要设置队列的最大值
    private int maxSize;

    //数据存储的位置
    private int[] data;

    public ArrayQueue(int maxSize) {
        this.maxSize = maxSize;
        this.data = new int[maxSize];
    }

    /**
     * 队列是否为空
     *
     * @return boolean
     **/
    public boolean isEmpty() {
        return this.rear == this.front;
    }

    /**
     * 队列是否已满
     *
     * @return boolean
     **/
    public boolean isFull() {
        return this.rear == (this.maxSize - 1);
    }

    /**
     * 数据入队
     *
     * @param data int 数据值
     *
     * @return boolean
     **/
    public boolean inQueue(int data) {
        if (this.isFull()) {
            return false;
        }
        this.data[++this.rear] = data;
        return true;
    }

    /**
     * 数据出队
     *
     * @return int
     *
     * @throws RuntimeException
     **/
    public int outQueue() {
        if (this.isEmpty()) {
            throw new RuntimeException("队列为空，出队失败");
        }
        return this.data[++this.front];
    }

    /**
     * 偷看一下下一个将要出队的数据
     *
     * @return void
     **/
    public void peek() {
        if (this.isEmpty()) {
            return;
        }
        System.out.printf("下一个即将出队的数据为：%d \n", this.data[this.front + 1]);
    }

    /**
     * 打印队列数据
     *
     * @return void
     **/
    public void print() {
        if (this.isEmpty()) {
            return;
        }
        System.out.println("下面是队列中的所有数据");
        for (int i = this.front + 1; i <= this.rear; i++) {
            System.out.printf("%d \t", this.data[i]);
        }
        System.out.println();
    }
}
